home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 9 / FM Towns Free Software Collection 9.iso / t_os / tool / wings / w2_src / pager.asm < prev    next >
Assembly Source File  |  1994-11-16  |  17KB  |  788 lines

  1.     .386p
  2. ;
  3. VRAM_SEL    equ    0120h
  4. VRAM_OFF    equ    0200h
  5. L_LINE        equ    0
  6. TAB            equ    9
  7. CRLF        equ 0A0Dh
  8. CR            equ 0Dh
  9. LF            equ 0Ah
  10. ON            equ    1
  11. OFF            equ    0
  12. NULL        equ 0
  13. TAB_W        equ    3
  14. ;
  15. public        add_ebx
  16. public        add_edi
  17. public        tab_wide
  18. public        r_line
  19. public        max_str
  20. public        l_count_1
  21. public        l_count_2
  22. public        cr_disp
  23. extrn        col_ank_tbl:word
  24. extrn        col_kan_tbl:word
  25. extrn        fnt_ank_tbl:dword
  26. extrn        fnt_kan_tbl:dword
  27. extrn        off_adr_tbl:dword
  28. ;
  29. data        segment    dword 'DATA' use32
  30. ;
  31.             align 4
  32. extrn        max_line:dword
  33. extrn        pointer:dword
  34. extrn        filesize:dword
  35. cr_disp        db    ON
  36.             align    4
  37. add_ebx        dd     4, 3, 2, 1, 0, 0, 0, 0
  38. add_edi        dd  12, 9, 6, 3, 0, 0, 0, 0
  39. tab_wide    dd    3
  40. r_line        dd    328/2
  41. max_str        dd    52
  42. l_count_1    dd    39
  43. l_count_2    dd    512-156
  44. back_ground    dd    92 dup( 0cccccccch )
  45. jmp_tbl_1    dd    ank_ok_1, chk_kan_1
  46. jmp_tbl_2    dd    ank_ok_1, kan_ok_1
  47. jmp_tbl_3    dd    ank_ok_2, chk_kan_2
  48. jmp_tbl_4    dd    ank_ok_2, kan_ok_2
  49. jmp_tbl_5    dd    ank_ok_3, chk_kan_3
  50. jmp_tbl_6    dd    ank_ok_3, kan_ok_3
  51. ;
  52. cr_mark        dd    0ccaccccch, 0cccccccch, 0ccccccach, 0ccaccccch
  53.             dd    0cccccccch, 0ccccccach, 0ccaccccch, 0cccccccch
  54.             dd    0ccccccach, 0ccaccccch, 0cccccccch, 0ccccccach
  55.             dd    0ccaccccch, 0accccccch, 0ccccacach, 0caaacccch
  56.             dd    0cccccccch, 0ccccccach
  57. ;               +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
  58. chk_tbl_1    db    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  59.             db    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  60.             db    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  61.             db    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  62.             db    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  63.             db    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  64.             db    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  65.             db    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  66.             db    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  67.             db    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  68.             db    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  69.             db    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  70.             db    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  71.             db    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  72.             db    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  73.             db    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  74. ;               +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
  75. chk_tbl_2    db    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  76.             db    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  77.             db    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  78.             db    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  79.             db    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  80.             db    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  81.             db    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  82.             db    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0
  83.             db    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  84.             db    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  85.             db    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  86.             db    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  87.             db    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  88.             db    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  89.             db    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  90.             db    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0
  91. fnt_ank        dw    2*16 dup(?)
  92. fnt_kan        dd    256 dup(?)
  93. data        ends
  94. ;
  95. code        segment dword public 'CODE' use32
  96.             assume cs:code, ds:data
  97. ;----------------------------------------------------------
  98. ;    void    set_color( void );
  99. ;----------------------------------------------------------
  100.         public    set_color
  101.         db        'set_color', 9
  102. set_color    proc    near
  103.         push    edi
  104.         push    esi
  105. ;--- テキストカラーを決定する ---
  106.         ;--- ANKカラーコードを決定 ---
  107.         mov        esi, offset fnt_ank_tbl
  108.         mov        edi, offset fnt_ank
  109.         xor        eax, eax
  110.         mov        ecx, 16
  111. loop_01:
  112.         lodsw
  113.         mov        edx, eax
  114.         not        edx
  115.         and        eax, 0bbbbh
  116.         and        edx, 0cccch
  117.         or        eax, edx
  118.         stosw
  119.         loop    short loop_01
  120.         ;--- 漢字カラーコードを決定 ---
  121.         mov        esi, offset fnt_kan_tbl
  122.         mov        edi, offset fnt_kan
  123.         mov        ecx, 256
  124. loop_02:
  125.         lodsd
  126.         mov        edx, eax
  127.         not        edx
  128.         and        eax, 0bbbbbbbbh
  129.         and        edx, 0cccccccch
  130.         or        eax, edx
  131.         stosd
  132.         loop    short loop_02
  133.         pop        esi
  134.         pop        edi
  135.         ret
  136. set_color    endp
  137. ;----------------------------------------------------------
  138. ;    call_text( char *strptn, char *text, int now_line );
  139. ;----------------------------------------------------------
  140.         public    call_text
  141.         db    'call_text', 9
  142. call_text    proc    near
  143.         push    ebp
  144.         mov        ebp, esp
  145.         push    ebx
  146.         push    edi
  147.         push    esi
  148.         push    es
  149.         mov        ax, VRAM_SEL
  150.         mov        es, ax
  151.         ;--- 画面を背景色でクリアする ---
  152.         mov        eax, 0cccccccch
  153.         mov        ecx, 128*512
  154.         xor        edi, edi
  155. loop_00:
  156.         stosd
  157.         loop    short loop_00
  158.         ;--- ファイルサイズが 0だったらジャンプ
  159.         cmp        filesize, 0
  160.         je        end_1
  161.         mov        esi, [ebp+12]
  162.         mov        eax, [ebp+16]
  163.         mov        ebx, pointer
  164.         mov        ecx, [ebx+eax*4]
  165.         xor        ebx, ebx
  166.         xor        edx, edx
  167.         xor        edi, edi
  168. loop_05:
  169.         push    edi
  170. loop_03:
  171.         mov        ax, [esi+ecx]
  172.         ;--- TABのチェック ---
  173.         cmp        al, TAB
  174.         je        tab_rtn_1
  175.         ;--- CR・LFのチェック ---
  176.         cmp        ax, CRLF
  177.         je        crlf_rtn_1
  178.         ;--- 1バイト目の漢字のチェック ---
  179.         and        eax, 0ffh
  180.         mov        al, chk_tbl_1+eax
  181.         jmp        short [offset jmp_tbl_1+eax*4]
  182.         ;--- ANK文字表示 ---
  183. ank_ok_1:
  184.         mov        al, [esi+ecx]
  185.         call    put_ank
  186.         inc        ebx
  187.         inc        ecx
  188. jmp_03:
  189.         ;--- 1行の文字数チェック ---
  190.         cmp        ebx, max_str
  191.         jb        short loop_03
  192. jmp_05:
  193.         ;--- 行数のチェック ---
  194.         pop        edi
  195.         inc        edx
  196.         cmp        edx, max_line
  197.         je        end_1
  198.         cmp        edx, 81
  199.         je        end_1
  200.         ;--- テキストポインタを次に進める
  201.         inc        word ptr [ebp+16]
  202.         mov        eax, [ebp+16]
  203.         mov        ebx, pointer
  204.         mov        ecx, [ebx+eax*4]
  205.         xor        ebx, ebx
  206.         ;--- 文字書き込み番地を生成する ---
  207.         cmp        edx, 40
  208.         je        short jmp_06
  209.         add        edi, VRAM_OFF*12
  210.         jmp        short loop_05
  211. jmp_06:
  212.         mov        edi, r_line
  213.         jmp        short loop_05
  214.         ;--- 2バイト目の漢字のチェック ---
  215. chk_kan_1:
  216.         mov        al, [esi+ecx+1]
  217.         mov        al, chk_tbl_2+eax
  218.         jmp        short [offset jmp_tbl_2+eax*4]
  219.         ;--- 漢字表示 ---
  220. kan_ok_1:
  221.         ;--- 表示数チェック ---
  222.         mov        eax, max_str
  223.         dec        eax
  224.         cmp        ebx, eax
  225.         jae        short jmp_05
  226.         mov        ax, word ptr [esi+ecx]
  227.         call    put_kan
  228.         add        ebx, 2
  229.         add        ecx, 2
  230.         jmp        short jmp_03
  231. ;--- TAB処理 ---
  232. tab_rtn_1:
  233.         mov        eax, ebx
  234.         and        eax, tab_wide
  235.         add        ebx, add_ebx+eax*4
  236.         add        edi, add_edi+eax*4
  237.         inc        ecx
  238.         jmp        jmp_03
  239. ;--- CRLF処理 ---
  240. crlf_rtn_1:
  241.         cmp        cr_disp, OFF
  242.         je        jmp_05
  243.         ;--- check letter length
  244.         mov        eax, max_str
  245.         dec        eax
  246.         cmp        ebx, eax
  247.         jae        jmp_05
  248.         ;--- put CR mark
  249.         mov        eax, 0ab81h
  250.         call    put_cr_mark
  251.         jmp        jmp_05
  252. ;--- 終了 ---
  253. end_1:
  254.         pop        es
  255.         pop        esi
  256.         pop        edi
  257.         pop        ebx
  258.         pop        ebp
  259.         ret
  260. call_text    endp
  261. ;-----------------------------------------------------------------------------
  262. ;    put_next_words( char *strptn, char *text, int off_address, int now_line );
  263. ;-----------------------------------------------------------------------------
  264.         align    4
  265.         public    put_next_words
  266.         db    'put_next_words', 14
  267. put_next_words    proc    near
  268.         push    ebp
  269.         mov        ebp, esp
  270.         push    ebx
  271.         push    edi
  272.         push    esi
  273.         push    es
  274.         mov        ax, VRAM_SEL
  275.         mov        es, ax
  276.         mov        eax, dword ptr [ebp+16]
  277.         and        eax, 0ffffff80h
  278.         shl        eax, 2
  279.         add        eax, 512*480
  280.         add        eax, r_line
  281.         and        eax, 03ffffh
  282.         mov        edi, eax
  283.         ;--- 事前に行を背景色クリアする ---
  284.         cld
  285.         mov        ebx, 12
  286. loop_10:
  287.         mov        esi, offset back_ground
  288.         mov        ecx, l_count_1
  289.         rep        movsd
  290.         add        edi, l_count_2
  291.         and        edi, 03ffffh
  292.         dec        ebx
  293.         jne        short loop_10
  294.         mov        edi, eax
  295.         mov        eax, [ebp+20]
  296.         mov        ebx, pointer
  297.         mov        ecx, [ebx+eax*4]
  298.         mov        esi, dword ptr [ebp+12]
  299.         xor        ebx, ebx
  300. loop_13:
  301.         mov        ax, [esi+ecx]
  302.         ;--- TABのチェック ---
  303.         cmp        al, TAB
  304.         je        tab_rtn_2
  305.         ;--- CR・LFのチェック ---
  306.         cmp        ax, CRLF
  307.         je        crlf_rtn_2
  308.         ;--- 1バイト目の漢字のチェック ---
  309.         and        eax, 0ffh
  310.         mov        al, chk_tbl_1+eax
  311.         jmp        short [offset jmp_tbl_3+eax*4]
  312.         ;--- ANK文字表示 ---
  313. ank_ok_2:
  314.         mov        al, [esi+ecx]
  315.         call    put_ank
  316.         inc        ebx
  317.         inc        ecx
  318. jmp_13:
  319.         ;--- 1行の文字数チェック ---
  320.         cmp        ebx, max_str
  321.         jb        short loop_13
  322. jmp_11:
  323.         pop        es
  324.         pop        esi
  325.         pop        edi
  326.         pop        ebx
  327.         pop        ebp
  328.         ret
  329.         ;--- 2バイト目の漢字のチェック ---
  330. chk_kan_2:
  331.         mov        al, [esi+ecx+1]
  332.         mov        al, chk_tbl_2+eax
  333.         jmp        short [offset jmp_tbl_4+eax*4]
  334.         ;--- 漢字表示 ---
  335. kan_ok_2:
  336.         ;--- 表示数チェック ---
  337.         mov        eax, max_str
  338.         dec        eax
  339.         cmp        ebx, eax
  340.         jae        short jmp_11
  341.         mov        ax, word ptr [esi+ecx]
  342.         call    put_kan
  343.         add        ebx, 2
  344.         add        ecx, 2
  345.         jmp        jmp_13
  346. ;--- TAB処理 ---
  347. tab_rtn_2:
  348.         mov        eax, ebx
  349.         and        eax, tab_wide
  350.         add        ebx, add_ebx+eax*4
  351.         add        edi, add_edi+eax*4
  352.         inc        ecx
  353.         jmp        jmp_13
  354. ;--- CRLF処理 ---
  355. crlf_rtn_2:
  356.         cmp        cr_disp, OFF
  357.         je        jmp_11
  358.         ;--- check letter length
  359.         mov        eax, max_str
  360.         dec        eax
  361.         cmp        ebx, eax
  362.         jae        jmp_11
  363.         ;--- put CR mark
  364.         mov        eax, 0ab81h
  365.         call    put_cr_mark
  366.         jmp        jmp_11
  367. put_next_words    endp
  368. ;-----------------------------------------------------------------------------
  369. ;    put_back_words( char *strptn, char *text, int off_address, int now_line );
  370. ;-----------------------------------------------------------------------------
  371.         align    4
  372.         public    put_back_words
  373.         db    'put_back_words', 14
  374. put_back_words    proc    near
  375.         push    ebp
  376.         mov        ebp, esp
  377.         push    ebx
  378.         push    edi
  379.         push    esi
  380.         push    es
  381.         mov        ax, VRAM_SEL
  382.         mov        es, ax
  383.         mov        eax, dword ptr [ebp+16]
  384.         and        eax, 0ffffff80h
  385.         shl        eax, 2
  386.         add        eax, 512*500
  387.         and        eax, 03ffffh
  388.         mov        edi, eax
  389.         ;--- 事前に行を背景色クリアする ---
  390.         cld
  391.         mov        ebx, 12
  392. loop_20:
  393.         mov        esi, offset back_ground
  394.         mov        ecx, l_count_1
  395.         rep        movsd
  396.         add        edi, l_count_2
  397.         and        edi, 03ffffh
  398.         dec        ebx
  399.         jne        short loop_20
  400.         mov        edi, eax
  401.         mov        eax, [ebp+20]
  402.         sub        eax, 80
  403.         mov        ebx, pointer
  404.         mov        ecx, [ebx+eax*4]
  405.         mov        esi, dword ptr [ebp+12]
  406.         xor        ebx, ebx
  407. loop_23:
  408.         mov        ax, [esi+ecx]
  409.         ;--- TABのチェック ---
  410.         cmp        al, TAB
  411.         je        tab_rtn_3
  412.         ;--- CR・LFのチェック ---
  413.         cmp        ax, CRLF
  414.         je        crlf_rtn_3
  415.         ;--- 1バイト目の漢字のチェック ---
  416.         and        eax, 0ffh
  417.         mov        al, chk_tbl_1+eax
  418.         jmp        short [offset jmp_tbl_5+eax*4]
  419.         ;--- ANK文字表示 ---
  420. ank_ok_3:
  421.         mov        al, [esi+ecx]
  422.         call    put_ank
  423.         inc        ebx
  424.         inc        ecx
  425. jmp_23:
  426.         ;--- 1行の文字数チェック ---
  427.         cmp        ebx, max_str
  428.         jb        short loop_23
  429. jmp_21:
  430.         pop        es
  431.         pop        esi
  432.         pop        edi
  433.         pop        ebx
  434.         pop        ebp
  435.         ret
  436.         ;--- 2バイト目の漢字のチェック ---
  437. chk_kan_3:
  438.         mov        al, [esi+ecx+1]
  439.         mov        al, chk_tbl_2+eax
  440.         jmp        short [offset jmp_tbl_6+eax*4]
  441.         ;--- 漢字表示 ---
  442. kan_ok_3:
  443.         ;--- 表示数チェック ---
  444.         mov        eax, max_str
  445.         dec        eax
  446.         cmp        ebx, eax
  447.         jae        short jmp_21
  448.         mov        ax, word ptr [esi+ecx]
  449.         call    put_kan
  450.         add        ebx, 2
  451.         add        ecx, 2
  452.         jmp        jmp_23
  453. ;--- TAB処理 ---
  454. tab_rtn_3:
  455.         mov        eax, ebx
  456.         and        eax, tab_wide
  457.         add        ebx, add_ebx+eax*4
  458.         add        edi, add_edi+eax*4
  459.         inc        ecx
  460.         jmp        jmp_23
  461. ;--- CRLF処理 ---
  462. crlf_rtn_3:
  463.         cmp        cr_disp, OFF
  464.         je        jmp_21
  465.         ;--- check letter length
  466.         mov        eax, max_str
  467.         dec        eax
  468.         cmp        ebx, eax
  469.         jae        jmp_21
  470.         ;--- put CR mark
  471.         mov        eax, 0ab81h
  472.         call    put_cr_mark
  473.         jmp        jmp_21
  474. put_back_words    endp
  475. ;----------------------------------------------------------
  476. ;        put ↓ mark procedure
  477. ;----------------------------------------------------------
  478. put_cr_mark    proc
  479.         push    ecx
  480.         push    esi
  481.         mov        esi, offset cr_mark
  482.         mov        ecx, 12
  483. lp_pc0:
  484.         lodsd
  485.         stosd
  486.         lodsw
  487.         stosw
  488.         add        edi, VRAM_OFF-6
  489.         and        edi, 3ffffh
  490.         loop    short lp_pc0
  491.         pop        esi
  492.         pop        ecx
  493.         ret
  494. put_cr_mark    endp
  495. ;----------------------------------------------------------
  496. ;    void    vsync( void );
  497. ;----------------------------------------------------------
  498.         public    vsync
  499.         db    'vsync', 5
  500. vsync        proc    near
  501.         mov        dx, 0440h
  502.         mov        al, 30
  503.         out        dx, al
  504.         mov        dx, 0443h
  505. loop_18:
  506.         align    4
  507.         in        al, dx
  508.         and        al, 04h
  509.         je        short loop_18
  510.         ret
  511. vsync    endp
  512. ;----------------------------------------------------------
  513. ;        void    hsync( int loop );
  514. ;----------------------------------------------------------
  515.         public    hsync
  516.         db    'hsync', 5
  517. hsync    proc
  518.         push    ebp
  519.         mov        ebp, esp
  520.         mov        ecx, [ebp+8]
  521. lp_hs2:
  522.         mov        dx, 440h
  523.         mov        al, 30
  524.         out        dx, al
  525.         mov        dx, 443h
  526. lp_hs0:
  527.         align    4
  528.         in        al, dx
  529.         and        al, 2
  530.         jne        short lp_hs0
  531. lp_hs1:
  532.         align    4
  533.         in        al, dx
  534.         and        al, 2
  535.         je        short lp_hs1
  536.         loop    short lp_hs2
  537.         pop        ebp
  538.         ret
  539. hsync    endp
  540. ;----------------------------------------------------------
  541. ;    crtc( char adress, short data );
  542. ;----------------------------------------------------------
  543.         public    crtc
  544.         db    'crtc', 4
  545. crtc    proc    near
  546.         push    ebp
  547.         mov        ebp, esp
  548.         mov        dx, 440h
  549.         mov        al, [ebp+8]
  550.         out        dx, ax
  551.         mov        dx, 442h
  552.         mov        ax, [ebp+12]
  553.         out        dx, ax
  554.         pop        ebp
  555.         ret
  556. crtc    endp
  557. ;------------------------------------------------------------------------------
  558. ;    void    up_scroll( int offset_adress, int *new_offset_address, int speed );
  559. ;------------------------------------------------------------------------------
  560.         align    4
  561.         public    up_scroll
  562.         db    'up_scroll', 9
  563. up_scroll        proc near
  564.         push    ebp
  565.         mov        ebp, esp
  566.         push    edi
  567.         push    esi
  568.         push    es
  569.         ;--- スクロールラインを転送する ---
  570.         mov        eax, dword ptr [ebp+8]
  571.         and        eax, 0ffffff80h
  572.         shl        eax, 2
  573.         mov        esi, eax
  574.         mov        edi, eax
  575.         add        esi, r_line
  576.         add        edi, 512*480
  577.         and        edi, 03ffffh
  578.         and        esi, 03ffffh
  579.         mov        ecx, l_count_1
  580.         push    ds
  581.         mov        ax, VRAM_SEL
  582.         mov        ds, ax
  583.         mov        es, ax
  584.         cld
  585.         rep        movsd
  586.         pop        ds
  587.         ;--- オフセットアドレスを増やしてスクロール ---
  588.         mov        eax, dword ptr [ebp+8]
  589.         add        eax, 128
  590.         and        eax, 0ffffh
  591.         mov        esi, dword ptr [ebp+12]
  592.         mov        [esi], eax
  593.         mov        dx, 0440h
  594.         mov        al, 17
  595.         out        dx, al
  596.         mov        eax, dword ptr [esi]
  597.         mov        dx, 0442h
  598.         out        dx, ax
  599.         ;--- ウェイト ---
  600.         mov        ecx, dword ptr [ebp+16]
  601.         jecxz    short    out_1
  602.         mov        dx, 0440h
  603.         mov        al, 30
  604.         out        dx, al
  605.         mov        dx, 0443h
  606. loop_X:
  607.         align    4
  608.         in        al, dx
  609.         and        al, 02h
  610.         je        loop_X
  611.         in        al, dx
  612.         and        al, 02h
  613.         jne        loop_X
  614.         loop    short loop_X
  615. out_1:
  616.         pop        es
  617.         pop        esi
  618.         pop        edi
  619.         pop        ebp
  620.         ret
  621. up_scroll    endp
  622. ;--------------------------------------------------------------------------
  623. ;    void    down_scroll( int offset_adress, int *new_offset_address, int );
  624. ;--------------------------------------------------------------------------
  625.         align    4
  626.         public    down_scroll
  627.         db    'down_scroll', 11
  628. down_scroll        proc near
  629.         push    ebp
  630.         mov        ebp, esp
  631.         push    edi
  632.         push    esi
  633.         push    es
  634.         ;--- スクロールラインを転送する ---
  635.         mov        eax, dword ptr [ebp+8]
  636.         and        eax, 0ffffff80h
  637.         shl        eax, 2
  638.         mov        esi, eax
  639.         mov        edi, eax
  640.         add        esi, 512*479
  641.         add        edi, 512*511
  642.         add        edi, r_line
  643.         and        edi, 03ffffh
  644.         and        esi, 03ffffh
  645.         mov        ecx, l_count_1
  646.         push    ds
  647.         mov        ax, VRAM_SEL
  648.         mov        ds, ax
  649.         mov        es, ax
  650.         cld
  651.         rep        movsd
  652.         pop        ds
  653.         ;--- オフセットアドレスを減らしてスクロール ---
  654.         mov        eax, dword ptr [ebp+8]
  655.         sbb        eax, 128
  656.         and        eax, 0ffffh
  657.         mov        esi, dword ptr [ebp+12]
  658.         mov        [esi], eax
  659.         mov        dx, 0440h
  660.         mov        al, 17
  661.         out        dx, al
  662.         mov        eax, dword ptr [esi]
  663.         mov        dx, 0442h
  664.         out        dx, ax
  665.         ;--- ウェイト ---
  666.         mov        ecx, dword ptr [ebp+16]
  667.         jecxz    short    out_2
  668.         mov        dx, 0440h
  669.         mov        al, 30
  670.         out        dx, al
  671.         mov        dx, 0443h
  672. loop_Y:
  673.         align    4
  674.         in        al, dx
  675.         and        al, 02h
  676.         je        loop_Y
  677.         in        al, dx
  678.         and        al, 02h
  679.         jne        loop_Y
  680.         loop    short loop_Y
  681. out_2:
  682.         pop        es
  683.         pop        esi
  684.         pop        edi
  685.         pop        ebp
  686.         ret
  687. down_scroll    endp
  688. ;--------------------------------
  689. ; put ank font
  690. ; Use    esi : font pattern adress
  691. ;        ecx, edx : calclation
  692. ;--------------------------------
  693.         align    4
  694. put_ank        proc    near
  695.         push    ebx
  696.         push    ecx
  697.         push    edx
  698.         push    esi
  699.         mov        ebx, eax
  700.         shl        eax, 3
  701.         shl        ebx, 2
  702.         add        eax, ebx
  703.         mov        esi, dword ptr [ebp+8]
  704.         add        esi, eax
  705.         REPT    12
  706.         lodsb
  707.         mov        ecx, eax
  708.         and        ecx, 0f0h
  709.         shr        ecx, 4
  710.         mov        edx, eax
  711.         and        edx, 0ch
  712.         mov        eax, [offset fnt_ank+ecx*2]
  713.         stosw
  714.         mov        eax, [offset fnt_ank+edx*2]
  715.         stosb
  716.         add        edi, VRAM_OFF-3
  717.         and        edi, 03ffffh
  718.         endm
  719.         sub        edi, 0200h*12-3
  720.         and        edi, 03ffffh
  721.         pop        esi
  722.         pop        edx
  723.         pop        ecx
  724.         pop        ebx
  725.         ret
  726. put_ank        endp
  727. ;--------------------------------
  728. ; put kanji font
  729. ; Use    esi : font pattern adress
  730. ;        ecx, edx : calclation
  731. ;--------------------------------
  732.         align    4
  733. put_kan        proc    near
  734.         push    ebx
  735.         push    ecx
  736.         push    edx
  737.         push    esi
  738.         xor        ecx, ecx
  739.         mov        edx, eax
  740.         ;--- SJIS to JIS
  741.         ror        dx, 8
  742.         shl        dh, 1
  743.         cmp        dl, 080h
  744.         adc        dx, 1f61h
  745.         add        dl, 7fh
  746.         jc        short c_01
  747.         add        dl, 0a2h
  748. c_01:
  749.         and        dh, 7fh
  750.         cmp        edx, 000004f54h
  751.         jb        short c_02
  752.         mov        edx, 02223h
  753. c_02:
  754.         mov        eax, edx
  755.         sub        eax, 000002121h
  756.         shr        eax, 8
  757.         mov        eax, [offset off_adr_tbl+eax*4]
  758.         and        edx, 0000000ffh
  759.         sub        edx, 000000021h
  760.         add        eax, edx
  761.         mov        ebx, eax
  762.         shl        eax, 4
  763.         shl        ebx, 3
  764.         add        eax, ebx
  765.         mov        esi, dword ptr [ebp+8]
  766.         add        esi, eax
  767.         REPT    12
  768.         lodsw
  769.         mov        cl, al
  770.         mov        dl, ah
  771.         mov        eax, [offset fnt_kan+ecx*4]
  772.         stosd
  773.         mov        eax, [offset fnt_kan+edx*4]
  774.         stosw
  775.         add        edi, VRAM_OFF-6
  776.         and        edi, 03ffffh
  777.         endm
  778.         sub        edi, 0200h*12-6
  779.         and        edi, 03ffffh
  780.         pop        esi
  781.         pop        edx
  782.         pop        ecx
  783.         pop        ebx
  784.         ret
  785. put_kan        endp
  786. code        ends
  787.             end
  788.